#!/usr/bin/env python
# -*- coding=iso8859-1 -*-
import urllib
from xml.dom import minidom

def getText(nodelist):
    rc = []
    for node in nodelist:
        if not node.data.isspace():
            rc.append(node.data)
    return ''.join(rc)

class Simepar():
    def __init__(self, code='4101408'):
        self.url = 'http://www.simepar.br/tempo2/xml/PR/%s.xml' % code
        self.xmlString = self.parseUrl()
        self.domBoletim = self.getDomBoletim()
        self.parseBoletim()
        self.tituloCidade = self.getTituloCidade()
        self.linhaDatas = self.getLinhaDatas()
        self.tituloPeriodo = self.getTituloPeriodo()
        self.linhaTempo = self.getLinhaTempo()
        self.linhaTemperatura = self.getLinhaTemperatura()
        self.linhaVento = self.getLinhaVento()
        self.linhaVisibilidade = self.getLinhaVisibilidade()

    def parseBoletim(self):
        self.municipio = self.parseMunicipio()
        self.periodo = self.parsePeriodo()
        self.data = self.parseData()
        self.condicoes = self.parseCondicoes()

    def parseUrl(self):
        try:
            s = urllib.urlopen(url).read()
        except:
            s = file('sample.xml').read()
        return s

    def getDomBoletim(self):
        elementList = minidom.parseString(self.xmlString).getElementsByTagName('boletim') 
        if elementList:
            return elementList[0]
        else:
            return None

    def parseMunicipio(self):
        elementList = self.domBoletim.getElementsByTagName('municipio')
        if elementList:
            return Municipio(elementList[0])
        else:
            return None

    def parsePeriodo(self):
        if self.domBoletim.hasAttribute('periodo'):
            return self.domBoletim.attributes['periodo'].nodeValue
        else:
            return None

    def parseData(self):
        if self.domBoletim.hasAttribute('data'):
            return self.domBoletim.attributes['data'].nodeValue
        else:
            return None

    def parseCondicoes(self):
        res = []
        elementList = self.domBoletim.getElementsByTagName('condicoes')
        if elementList:
            domCondicoes = elementList[0]
            for i in domCondicoes.getElementsByTagName('*'):
                res.append(Condicao(i))

        return res

    def htmlTemplate(self):
        return self.getHTMLfromTemplate()

    def getHTMLfromTemplate(self):
        f=open('template.html')
        s=f.read()
        f.close()

        tituloCidade = self.tituloCidade
        tituloPeriodo = self.tituloPeriodo
        linhaDatas = self.linhaDatas
        linhaTempo = self.linhaTempo
        linhaTemperatura = self.linhaTemperatura
        linhaVento = self.linhaVento
        linhaVisibilidade = self.linhaVisibilidade

        return s % {'tituloCidade':tituloCidade.encode('iso8859-1'),
                   'tituloPeriodo':tituloPeriodo.encode('iso8859-1'),
                   'linhaDatas':linhaDatas.encode('iso8859-1'),
                   'linhaTempo':linhaTempo.encode('iso8859-1'),
                   'linhaTemperatura':linhaTemperatura.encode('iso8859-1'),
                   'linhaVento':linhaVento.encode('iso8859-1'),
                   'linhaVisibilidade':linhaVisibilidade.encode('iso8859-1')}

    def getTituloCidade(self):
        return '<p class="texto"><b><font size="3">Previs&atilde;o do Tempo \
        para %s</font></b></p>' % self.municipio.nome

    def getTituloPeriodo(self):
        return '''                    <tr>
                        <td colspan="%d" id="tabelaprevisaocidadetitulo"><center><span id="branco12b">Previs&atilde;o para 5 dias</span></center></td>
                    </tr>''' % self.municipio.totalColunas

    def getLinhaDatas(self):
        res = ['''                    <tr> 
                        <td id="tabelaprevisaocidadesub"> 
                            &nbsp;
                        </td>''']
        for i in self.municipio.dias:
            data = i.data
            diadasemana = i.diadasemana
            colspan = i.totalColunas
            if colspan > 1:
                textColSpan = 'colspan="%d"' % colspan
            else:
                textColSpan = ''
            res.append('''                        <td %(colspan)s id="tabelaprevisaocidadesub"> 
                            %(diadasemana)s, %(data)s
                        </td>''' %
                        {'colspan':textColSpan,'diadasemana':diadasemana,'data':data})
        res.append('''
                    </tr>''')
        return ''.join(res)

    def getLinhaTempo(self):
        periodoDescDict = {'legendamanha':'Manh&atilde;',
                           'legendamadrugada':'Madrugada',
                           'legendadia':'Dia',
                           'legendatarde':'Tarde',
                           'legendanoite':'Noite'}
        res = ['''                    <tr> 
                        <td id="tabelaprevisaocidadesub">Tempo</td>''']

        for i in self.municipio.dias:
            tempoList = i.tempos
            for t in tempoList:
                for legenda in t.legendas:
                    periodoDesc = legenda.nome
                    icone = legenda.icone
                    texto = legenda.descricao
                    res.append('''                        <td id="tabelaprevisaocidadeimg" valign="top"> 
                            %(periodoDesc)s<br />
                            <img src="%(icone)s" /><br />
                            %(texto)s
                        </td>'''% {'periodoDesc':periodoDesc,
                                   'icone':icone,
                                   'texto':texto})
        res.append('''
                    </tr>''')
        return ''.join(res)

    def getLinhaTemperatura(self):
        res = ['''                    <tr> 
                    <td id="tabelaprevisaocidadesub">Temperaturas</td>''']
        for i in self.municipio.dias:
            temperatura = i.temperatura
            colspan = i.totalColunas
            if colspan > 1:
                textColSpan = 'colspan="%d"' % colspan
            else:
                textColSpan = ''
            if temperatura:
                res.append('''                        <td %(colspan)s> 
                                <span id="vermelho10">M&aacute;x. %(max)s&ordm;</span><br />
                                <span id="azul10">M&iacute;n. %(min)s&ordm;</span>
                            </td>''' % {'max':temperatura.maxima,
                                        'min':temperatura.minima,
                                        'colspan':textColSpan})
            else:
                res.append('<td %s></td>' % textColSpan)

        res.append('''
                        </tr>''')

        return ''.join(res)

    def getLinhaVento(self):
        res = ['''                    <tr> 
                            <td id="tabelaprevisaocidadesub">Vento</td>''']
        for i in self.municipio.dias:
            vento = i.vento
            colspan = i.totalColunas
            if colspan > 1:
                textColSpan = 'colspan="%d"' % colspan
            else:
                textColSpan = ''
            if vento:
                res.append('''                        <td %(colspan)s> 
                                %(direcao)s, %(intensidade)s
                            </td>''' % {'colspan':textColSpan,
                            'direcao':vento.direcao,
                            'intensidade':vento.intensidade})
            else:
                res.append('<td %s></td>'%textColSpan)

        res.append('''
                        </tr>''')
        return ''.join(res)

    def getLinhaVisibilidade(self):
        res = ['''                    <tr> 
                            <td id="tabelaprevisaocidadesub">Visibilidade</td>''']
        for i in self.municipio.dias:
            visibilidade = i.visibilidade
            colspan = i.totalColunas
            if colspan > 1:
                textColSpan = 'colspan="%d"' % colspan
            else:
                textColSpan = ''
            if visibilidade:
                res.append('''                        <td %(colspan)s> 
                                %(visibilidade)s
                            </td>''' % {'visibilidade':visibilidade,
                                        'colspan':textColSpan})
            else:
                res.append('<td %s></td>'%textColSpan)

        res.append('''
                            </tr>''')
        return ''.join(res)

class Condicao():
    def __init__(self,domElement):
        self.domElement = domElement
        self.data = self.parseData()
        self.diadasemana = self.parseDiaDaSemana()
        self.dados = self.parseDados()

    def parseData(self):
        if self.domElement.hasAttribute('data'):
            return self.domElement.attributes['data'].nodeValue
        else:
            return None

    def parseDiaDaSemana(self):
        if self.domElement.hasAttribute('diadasemana'):
            return self.domElement.attributes['diadasemana'].nodeValue
        else:
            return None

    def parseDados(self):
        return getText(self.domElement.childNodes)

class Municipio():
    def __init__(self, domElement):
        self.domElement = domElement
        self.municipioId = self.parseMunicipioId()
        self.nome = self.parseNome()
        self.latitude = self.parseLatitude()
        self.longitude = self.parseLongitude()
        self.dias = self.parseDias()
        self.totalColunas = self.getTotalColunas()

    def getTotalColunas(self):
        contador = 0
        for tempo in self.domElement.getElementsByTagName('tempo'):
            legendas = tempo.getElementsByTagName('*')
            contador += len(legendas)
        return contador

    def parseMunicipioId(self):
        if self.domElement.hasAttribute('id'):
            municipioId = self.domElement.attributes['id'].nodeValue
        else:
            municipioId = None
        return municipioId

    def parseNome(self):
        if self.domElement.hasAttribute('nome'):
            nome = self.domElement.attributes['nome'].nodeValue
        else:
            nome = None
        return nome

    def parseLatitude(self):
        if self.domElement.hasAttribute('latitude'):
            latitude = self.domElement.attributes['latitude'].nodeValue
        else:
            latitude = None
        return latitude

    def parseLongitude(self):
        if self.domElement.hasAttribute('longitude'):
            longitude = self.domElement.attributes['longitude'].nodeValue
        else:
            longitude = None
        return longitude

    def parseDias(self):
        res = []
        for i in self.domElement.childNodes:
            if i.nodeType == i.ELEMENT_NODE:
                res.append(Dia(i))
        return res

class Dia():
    def __init__(self,domElement):
        self.domElement = domElement
        self.data = self.parseData()
        self.diadasemana = self.parseDiaDaSemana()
        self.tempos = self.parseTempos()
        self.temperatura = self.parseTemperatura()
        self.vento = self.parseVento()
        self.visibilidade = self.parseVisibilidade()
        self.totalColunas = self.getTotalColunas()

    def getTotalColunas(self):
        contador = 0
        for tempo in self.domElement.getElementsByTagName('tempo'):
            legendas = tempo.getElementsByTagName('*')
            contador += len(legendas)
        return contador

    def parseDiaDaSemana(self):
        if self.domElement.hasAttribute('diadasemana'):
            return self.domElement.attributes['diadasemana'].nodeValue
        else:
            return None

    def parseData(self):
        if self.domElement.hasAttribute('data'):
            return self.domElement.attributes['data'].nodeValue
        else:
            return None

    def parseTempos(self):
        elementList = self.domElement.getElementsByTagName('tempo')
        res = []
        for domElement in elementList:
            res.append(Tempo(domElement))
        return res

    def parseTemperatura(self):
        elementList = self.domElement.getElementsByTagName('temperatura')
        if elementList:
            return Temperatura(elementList[0])
        else:
            return None

    def parseVento(self):
        elementList = self.domElement.getElementsByTagName('vento')
        if elementList:
            return Vento(elementList[0])
        else:
            return None

    def parseVisibilidade(self):
        elementList = self.domElement.getElementsByTagName('visibilidade')
        if elementList:
            return getText(elementList[0].childNodes)
        else:
            return None

class Tempo():
    def __init__(self,domElement):
        self.domElement = domElement
        self.legendas = self.parseLegendas()

    def parseLegendas(self):
        elementList = self.domElement.getElementsByTagName('*')
        res =[]
        for domElement in elementList:
            res.append(Legenda(domElement))

        return res

class Legenda():
    def __init__(self, domElement):
        self.domElement = domElement
        self.legendaId = self.parseId()
        self.nome = self.parseNome()
        self.icone = self.parseIcone()
        self.descricao = self.parseDescricao()

    def parseNome(self):
        descricao = {'legendamanha':'Manh&atilde;',
                     'legendamadrugada':'Madrugada',
                     'legendadia':'Dia',
                     'legendatarde':'Tarde',
                     'legendanoite':'Noite'}
        return descricao[self.domElement.localName]

    def parseId(self):
        if self.domElement.hasAttribute('id'):
            return self.domElement.attributes['id'].nodeValue
        else:
            return None

    def parseIcone(self):
        if self.domElement.hasAttribute('icone'):
            return self.domElement.attributes['icone'].nodeValue
        else:
            return None

    def parseDescricao(self):
        return getText(self.domElement.childNodes)

class Temperatura():
    def __init__(self, domElement):
        self.domElement = domElement
        self.minima = self.parseMinima()
        self.maxima = self.parseMaxima()

    def parseMinima(self):
        elementList = self.domElement.getElementsByTagName('min')
        if elementList:
            return getText(elementList[0].childNodes)
        else:
            return None

    def parseMaxima(self):
        elementList = self.domElement.getElementsByTagName('max')
        if elementList:
            return getText(elementList[0].childNodes)
        else:
            return None

class Vento():
    def __init__(self, domElement):
        self.domElement = domElement
        self.intensidade = self.parseIntensidade()
        self.direcao = self.parseDirecao()

    def parseIntensidade(self):
        elementList = self.domElement.getElementsByTagName('intensidade')
        if elementList:
            return getText(elementList[0].childNodes)
        else:
            return None

    def parseDirecao(self):
        elementList = self.domElement.getElementsByTagName('direcao')
        if elementList:
            return getText(elementList[0].childNodes)
        else:
            return None

if __name__ == '__main__':
    boletim = Simepar()
    s = boletim.getHTMLfromTemplate()
    print s
